import axios from 'axios'
import {
  Notification,
  MessageBox,
  Message
} from 'element-ui'
import store from '@/store'
import {
  getToken
} from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import {
  tansParams
} from "@/utils/ruoyi";


axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 30000
})

// request拦截器
service.interceptors.request.use(config => {
  // 是否需要设置 token
  const isToken = (config.headers || {}).isToken === false
  if (getToken() && !isToken) {
    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  // get请求映射params参数
  if (config.method === 'get' && config.params) {
    let url = config.url + '?';
    for (const propName of Object.keys(config.params)) {
      const value = config.params[propName];
      var part = encodeURIComponent(propName) + "=";
      if (value !== null && typeof (value) !== "undefined") {
        if (typeof value === 'object') {
          for (const key of Object.keys(value)) {
            let params = propName + '[' + key + ']';
            var subPart = encodeURIComponent(params) + "=";
            url += subPart + encodeURIComponent(value[key]) + "&";
          }
        } else {
          url += part + encodeURIComponent(value) + "&";
        }
      }
    }
    url = url.slice(0, -1);
    config.params = {};
    config.url = url;
  }
  return config
}, error => {
  console.log(error)
  Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
    // 未设置状态码则默认成功状态
    let pathname = window.location.pathname
    let boolean = true
    if (pathname == '/index/lcd' || pathname == '/index/energy' || pathname == '/index' || pathname == '/' || pathname == '/produce/produceEcharts/produceEcharts' || pathname == '/produce/produceEcharts/produceEchartsAll' || pathname == '/equipment/equipmentEcharts' || pathname == '/report/reportEcharts' || pathname == '/index/capacityDesign' || pathname == '/index/seven' || pathname == '/index/productionDesign' ||
      pathname == '/special/parcel/indexs' || pathname == '/special/parcel/sevenEcharts' || pathname == '/special/parcel/productionDesign' || pathname == '/special/parcel/capacityDesign' || pathname == '/special/parcel/equipmentEcharts' || pathname == '/special/parcel/energy' || pathname == '/special/parcel/produceEcharts' || pathname == '/special/group/produceEchartsAll') {
      boolean = false
    } else {
      boolean = true
    }
    if(res.config.url=='/report/result/getRealWsd'){
      boolean = false
    }
    const code = res.data.code || 200;
    // 获取错误信息
    const msg = errorCode[code] || res.data.msg || errorCode['default']
    if (code === 401) {
      MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        store.dispatch('LogOut').then(() => {
          location.href = '/login';
        })
      }).catch(() => {});
    } else if (code === 500) {
      Message.closeAll()
      if (boolean == true) {
        Message({
          message: msg,
          type: 'error'
        })
      }
      return Promise.reject(new Error(msg))
    } else if (code !== 200) {
      if (boolean == true) {
        Notification.error({
          title: msg
        })
      }

      return Promise.reject('error')
    } else {
      return res.data
    }
  },

  error => {
    console.log('err' + error)
    let {
      message
    } = error;
    let pathname2 = window.location.pathname
    let boolean2 = true
    if (pathname2 == '/index/lcd' || pathname2 == '/index/energy' || pathname2 == '/index' || pathname2 == '/' || pathname2 == '/produce/produceEcharts/produceEcharts' || pathname2 == '/produce/produceEcharts/produceEchartsAll' || pathname2 == '/equipment/equipmentEcharts' || pathname2 == '/report/reportEcharts' || pathname2 == '/index/capacityDesign' || pathname2 == '/index/seven' || pathname2 == '/index/productionDesign' ||
      pathname2 == '/special/parcel/indexs' || pathname2 == '/special/parcel/sevenEcharts' || pathname2 == '/special/parcel/productionDesign' || pathname2 == '/special/parcel/capacityDesign' || pathname2 == '/special/parcel/equipmentEcharts' || pathname2 == '/special/parcel/energy' || pathname2 == '/special/parcel/produceEcharts' || pathname2 == '/special/group/produceEchartsAll') {
      boolean2 = false
    } else {
      boolean2 = true
    }
    if (boolean2 == true) {
      if (message == "Network Error") {
        message = "后端接口连接异常";
      } else if (message.includes("timeout")) {
        message = "系统接口请求超时";
      } else if (message.includes("Request failed with status code")) {
        message = "系统接口" + message.substr(message.length - 3) + "异常";
      }
    }
    Message.closeAll()
    if (boolean2 == true) {
      Message({
        message: message,
        type: 'error',
        duration: 5 * 1000
      })
    }
    return Promise.reject(error)
  }
)

// 通用下载方法
export function download(url, params, filename) {
  return service.post(url, params, {
    transformRequest: [(params) => {
      return tansParams(params)
    }],
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    timeout: 60000,
    responseType: 'blob'
  }).then((data) => {
    // console.log(data.type);
    if (data.type == 'application/json') {
      alert('文件下载失败');
      // this.$message({
      //   message: '警告哦，这是一条警告消息',
      //   type: 'warning'
      // });
    } else { //直接下载文件
      const content = data
      const blob = new Blob([content])
      if ('download' in document.createElement('a')) {
        const elink = document.createElement('a')
        elink.download = filename
        elink.style.display = 'none'
        elink.href = URL.createObjectURL(blob)
        document.body.appendChild(elink)
        elink.click()
        URL.revokeObjectURL(elink.href)
        document.body.removeChild(elink)
      } else {
        navigator.msSaveBlob(blob, filename)
      }
    }

  }).catch((r) => {
    console.error(r)
  })
}

export default service
